MongoDB 是一個開源的文件資料庫。使用的是NoSQL資料庫概念。
NoSQL (Not only SQL) 針對於傳統資料庫系統有不一樣的做法來因應資料量的巨量成長,因此,有 "資料表可延伸性" , "自由長度欄位" ,"分散式" ,"大容量" ,"資料一致性" 的特性存在。並不是說NoSQL就一定比傳統資料庫管理系統還要好。針對不同的應用使用適合的資料庫管理系統才是最棒的做法。
如上述所提,MongoDB使用的是文件導向(Document-Oriented) 的儲存概念(Storage)。在概念上,使用的是JSON / BSON 儲存、讀取每筆資料。因為符合NoSQL的特性。所以,其資料庫也可以同時存在不同tuple長度的資料表。
至於為何使用BSON(Binary Json)格式來存取資料,就必須提及在儲存資料在MongoDB資料表時候,因為資料可以快速的加解密以及儲存資料的方便(不同 data type 皆視為binary json處理),因此使用BSON即可達到上述目的。
根據官方網站的安裝說明:
先加入public key 到套件管理系統。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
重新reload並且更新apt
sudo apt-get update
安裝MondgoDB (當然官方有教學可以安裝特定版本 請點我)
sudo apt-get install -y mongodb-org
安裝完之後 預設是自動開機啟動。那我們要來測試基本指令。
首先就是 啟動 停止 以及 重啟
sudo service mongod start
sudo service mongod stop
sudo service mongod restart
// MongoDB 預設資料庫目錄存於/data/db ,如果沒有預設建立就必須手動創造
mkdir -p /data/db
// 更改目錄權限
chown id -u /data/db
// 啟動mongoDB
mongod
當服務啟動,就可以使用 mongo 指令來進入操作資料庫。
mongo
預設上是會以test當作臨時資料庫。我們可以使用test資料庫,或者是另外創建一個資料庫來進行操作。由於上述所提及的資料表可延展性以及自由欄位長度。我們可以直接進入一個新的資料庫(進入的同時即會同時創建資料庫),這裡假設名稱為:yourDB。
use yourDB
當進入資料庫的時候,我們可以直接建立測試資料。格式皆為JSON。
test1={"user":"sam"}
test2={"user":"merry","age":13}
上述所提及兩筆資料,欄位長度不同但是卻可以存在同一資料表(collection)下。
我們用以下指令寫入資料庫的 people 資料表下。
db.people.insert(test1)
db.people.insert(test2)
當然,輸入完之後我們可以使用find()指令來查看資料表的內容。
db.people.find()
會看到以下畫面
{ "_id" : ObjectId("tc2509f9f3d24d31102bdqq4"), "user" : "sam" }
{ "_id" : ObjectId("tc2509fef3d24d31102bdqq4"), "user" : "merry", "age" : 13 }
預設我們的資料庫為Boo , 資料表為accounts ,欲新增10筆資料 (因前面已經增加兩筆,所以變數從3開始)
可使用JavaScript 語法
for(i=3; i<=10; i++) { var a = "test" + i; var b = "test" + i + "_p"; db.accounts.insert({"username" : a, "password" : b}) }
成功會顯示如下:
加入測試資料之後,我們就可以看到,我們建立了一個資料庫(db)稱為Boo,然而資料表(Collections)叫做accounts,接著有10筆帳戶資料。(當然,這邊沒有做密碼加密,只是做個簡單的測試)
修改欄位。接下來我們要來做修改的動作,如果有資料錯誤我們可以透過Update指令來幫助我們修改資料。但這邊有一點必須注意, mongoDB一開始的Update 是更新所有欄位。
換句話說假設我們有A,B,C 欄位,我們欲更新C欄位資料,就必須指定C欄位的值才可以。如果沒有則會更新成C欄位(A,B欄位會消失!!!)。
狀況如下: (假設我們要修改test3的密碼為test333)
照Update語法理應上是
db.accounts.update({username:”test3”} , {password:”test333”})
好! 我們來看一下更新情形!使用find()指令
發現! 其他欄位怎麼不見了!? ,因為你告訴mongoDB 我要將username以及password 更新成 只有 password欄位(如果沒有欄位存在,則會變成新增)。
所以,如果只是要更新欄位資料,就必須指定欄位值:
前面加入$set: {<欲修改欄位>}
因此,我們可以看到更新(修改資料)完成,也可以了解到他新增,刪除皆可以靠Update來完成的便利性。(前提是使用上要小心點,避免刪除欄位或者是修改到欄位)
當然,也有$unset:移除欄位,$inc:欄位加值 等等指令存在。這個可以在mongoDB 官網上查詢使用方式。
好的那假設今天我們要來新增朋友名單,關係圖如下:
那我們可以藉由下列指令來幫助我們建構這個關係
可以看到在mongoDB中資料表為下:
好的,那我們就已經完成Boo it 最基本的帳戶資料以及朋友名單。這裡先不考慮密碼加密問題!只是做簡單的建立資料庫內容。
參考資料來源:
非常感謝這些網站的作者們寫的筆記。
Andy作者這次也有參加鐵人比賽,寫的文章很精彩!
http://andyyou.logdown.com/posts/177570-mongodb-notes
這裡有從SQL轉換到MongoDB的語法 (如果你有語法上使用的問題可參考)
http://calvert.logdown.com/posts/159792-sql-to-mongodb-mapping-chart
補充說明:
根據 reference:db.collection.update(query, update, options)
我們上面寫:db.accounts.update({username:”test3”} , {password:”test333”})
意思是『檢索 username 為 test3 的那筆條目』,將其內容更新為『(只)含 password 這個欄位且其值為 test333』